package main
import "fmt"

/**
1 什么是闭包:	
	闭包就是一个函数和与其相关的引用环境组合的一个整体
	
2 闭包的本质:
	闭包本质依旧是一个匿名函数，只是这个函数引入外界的变量/参数著名函数+引用的变量/参数 =闭包

3 特点:
	(1)返回的是一个匿名函数，但是这个匿名函数引用到函数外的变量/参数,因此这个匿名函数就和变量/参数形成一个整体，构成闭包。
	(2)闭包中使用的变量/参数会一直保存在内存中，所以会一直使用---》意味着闭包不可滥用

4 不使用闭包可以吗?
*/

// getSum 函数返回值为一个函数，这个函数的参数是一个int类型的参数，返回值也是一个int类型的值
func getSum() func(int) int {
	var sum int = 0
	return func(num int) int {
		sum = sum + num
		return sum
	}
}

func main() {
	
	f := getSum()
	fmt.Println(f(1))	// 1
	fmt.Println(f(2)) // 3
	fmt.Println(f(3)) // 6
	
	fmt.Println(getSum()(1)) // 1
	fmt.Println(getSum()(2)) // 2
	fmt.Println(getSum()(3)) // 3
}